from django.shortcuts import render
from apps.verifications.captcha.captcha import captcha
from django.views import View
from django_redis import get_redis_connection
from django.http import HttpResponse
from django import http
import random
from celery_tasks.sms.tasks import send_ssm_code
# import sys

# print(sys.path)


# Create your views here.

class ImageVerificationsView(View):
    """
    用于图形验证码
    """

    def get(self, request, uuid):
        # 1. 调用captcha工具类生成验证码图形
        letter, image = captcha.generate_captcha()
        # 2.连接redis对应的数据库，并创建对象接收
        redis_conn = get_redis_connection("verify_code")
        # 3.创建redis数据库数据
        redis_conn.setex('img_%s' % uuid, 300, letter)
        # 4.返回图片
        return HttpResponse(image, content_type='image/ipg')


class SmsCodeView(View):
    """
    用于短信验证码
    GET http://www.meiduo.site:8000/sms_codes/15800000003/?image_code=&image_code_id=9bcb6fb1-6464-4dcc-b0bc-ac47a23da6fc
    """

    def get(self, request, mobile):
        """
        处理短信验证码逻辑
        :param request:
        :return:
        """
        # ==>逻辑补充_确保短信不是频繁获取的
        # 创建连接redis数据库
        redis_conn = get_redis_connection('verify_code')
        # 通过取出的值是不是空值判断手机号是否已存在
        sms_code_flag = redis_conn.get('sms_code_flag_ %s' % mobile)
        if sms_code_flag:
            return http.JsonResponse({'code': 400, 'error_message': '请不要频繁发送'})

        # 1.==>获取前段请求中的页面
        sms_codes_cline = request.GET.get('image_code')
        uuid = request.GET.get('image_code_id')

        # 2.==>判断数据是否为空
        if not all([sms_codes_cline, uuid]):
            return http.JsonResponse({'code': 400, 'error_message': '数据为空'})

        # 3.==>判断数据是否相等
        # 3.1创建链接Redis数据库对象

        # 3.2通过uuid获取对应的数据

        sms_code_redis = redis_conn.get('img_%s' % uuid).decode()
        print(sms_code_redis)
        # sms_code_redis = sms_codes_redis.decode()
        if sms_codes_cline.lower() != sms_code_redis.lower():
            return http.JsonResponse({'code': 400, 'error_message': '验证码错误'})

        # 4.==>发送短信验证码
        # 4.1生成随机短信验证码
        sms_code = random.randint(100000, 999999)
        # 4.2保存到redis数据库

        # 4.3创建redis管道，提高数据库的效率
        redis_pipline = redis_conn.pipeline()
        # redis_conn.setex('sms_code_flag %s' % mobile, 60, 1)
        redis_pipline.setex('sms_code_flag_ %s' % mobile, 60, 1)
        redis_pipline.setex('sms_code_ %s' % mobile, 300, sms_code)
        redis_pipline.execute()

        # 4.3通过容联云发送短信
        # CCP().send_template_sms('mobile', ['sms_code', 5], 1)
        send_ssm_code.delay(mobile, sms_code)

        # 5.==>返回响应
        return http.JsonResponse({'code': 0, 'error_message': sms_code})
